Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Dynamic lategame & Midround simulations #9858

Merged
merged 7 commits into from
Nov 7, 2023

Conversation

PowerfulBacon
Copy link
Member

About The Pull Request

  • Once the midround upper bound limit on dynamic has expired (100 minutes atm), threat checks are disabled and only rulesets with the LATEGAME flag can roll.
  • Updates the simulation algorithm to disable actually executing the rulesets so that clockie spawning won't cause it to take ages. This in turn makes the execution of the simulation a lot faster.

The rulesets that are considered late-game are ones that do not require a significant amount of prep time (we need to work with the assumption that the shuttle will come any minute) and that will generally cause enough chaos to result in the shuttle call coming closer. These rulesets are:

  • Wizard
  • Blob
  • Xenomorph Infestation
  • Space Dragon
  • Space Pirates
  • Spiders
  • Space Ninja

Note that once we reach the game end point, the time between threats will still remain the same as before so lower threat rounds will have longer gaps between lategame threats spawning, however will still ignore the cost of the ruleset.

In the future I will trial lowering this value to 75 minutes and making threat more consistent if we continue to have issues with exhausting rounds.

Why It's Good For The Game

Dynamic has an upper-bound on when it will consume all of its threat and after 100 minutes should stop spawning antags. This behaviour works for rounds that never exceed 90 minutes, however we are more commonly having rounds that go on for a really long amount of time which often end up in really large player drops. This will disengage threat once we reach the end game (100 minute mark) so that more chaotic threats will begin spawning even after all of the threat has been consumed. For most rounds we should either see:

  • Evacuation prior to dynamic lategame
  • Chaos slowly increasing over the round before reaching the end-game where more round-ending threats will begin to exclusively spawn.
  • Not much happening before round-ending threats begin to spawn. (Less ideal, but this is hard to control especially when we get low threat or low-pop rounds)

I have toyed around with the idea of decreasing the lategame dynamic time to 70 minutes as there will always be a delay and that will bring a wrap to the usual round in around 90-120 minutes, although I haven't changed it in this PR.

Of course not all long rounds are boring, however players still get exhausted from them and an overly long round (2.5 hours or more) can be deterimental especially at high-pop hours, as a large chunk of players leaving often results in less players joining.

Testing Photographs and Procedure

image

Note that after 60000 seconds, only certain rulesets can run

Json
[
  {
    "roundstart_players": 50,
    "threat_level": 40,
    "snapshot": {
      "antag_percent": 0.08,
      "remaining_threat": 23,
      "rulesets": [
        "Traitors"
      ]
    },
    "midround_rules": [
      {
        "ruleset": "Syndicate Sleeper Agent",
        "weight": 20,
        "cost": 8,
        "execution_time": 14571.4,
        "remaining_threat": 15,
        "simulated_alive_players": 49
      },
      {
        "ruleset": "Space Dragon",
        "weight": 4,
        "cost": 11,
        "execution_time": 29142.9,
        "remaining_threat": 4,
        "simulated_alive_players": 48
      },
      {
        "ruleset": "Blob",
        "weight": 3,
        "cost": 12,
        "execution_time": 72857.1,
        "remaining_threat": 0,
        "simulated_alive_players": 40
      }
    ]
  },
  {
    "roundstart_players": 50,
    "threat_level": 23.3,
    "snapshot": {
      "antag_percent": 0.04,
      "remaining_threat": 15.3,
      "rulesets": [
        "Traitors"
      ]
    },
    "midround_rules": [
      {
        "ruleset": "Obsessed",
        "weight": 3,
        "cost": 5,
        "execution_time": 21000,
        "remaining_threat": 10.3,
        "simulated_alive_players": 45
      },
      {
        "ruleset": "Morph",
        "weight": 3,
        "cost": 8,
        "execution_time": 42000,
        "remaining_threat": 2.3,
        "simulated_alive_players": 40
      },
      {
        "ruleset": "Space Pirates",
        "weight": 4,
        "cost": 8,
        "execution_time": 63000,
        "remaining_threat": 0,
        "simulated_alive_players": 38
      }
    ]
  },
  {
    "roundstart_players": 50,
    "threat_level": 30,
    "snapshot": {
      "antag_percent": 0.06,
      "remaining_threat": 15,
      "rulesets": [
        "Heretics"
      ]
    },
    "midround_rules": [
      {
        "ruleset": "Abductors",
        "weight": 4,
        "cost": 7,
        "execution_time": 16000,
        "remaining_threat": 8,
        "simulated_alive_players": 45
      },
      {
        "ruleset": "Space Pirates",
        "weight": 4,
        "cost": 8,
        "execution_time": 32000,
        "remaining_threat": 0,
        "simulated_alive_players": 45
      },
      {
        "ruleset": "Space Dragon",
        "weight": 4,
        "cost": 11,
        "execution_time": 64000,
        "remaining_threat": 0,
        "simulated_alive_players": 38
      }
    ]
  },
  {
    "roundstart_players": 50,
    "threat_level": 38.1,
    "snapshot": {
      "antag_percent": 0.04,
      "remaining_threat": 30.1,
      "rulesets": [
        "Traitors"
      ]
    },
    "midround_rules": [
      {
        "ruleset": "Abductors",
        "weight": 4,
        "cost": 7,
        "execution_time": 14571.4,
        "remaining_threat": 23.1,
        "simulated_alive_players": 47
      },
      {
        "ruleset": "Morph",
        "weight": 3,
        "cost": 8,
        "execution_time": 29142.9,
        "remaining_threat": 15.1,
        "simulated_alive_players": 44
      },
      {
        "ruleset": "Blob",
        "weight": 3,
        "cost": 12,
        "execution_time": 43714.3,
        "remaining_threat": 3.1,
        "simulated_alive_players": 44
      },
      {
        "ruleset": "Space Dragon",
        "weight": 4,
        "cost": 11,
        "execution_time": 72857.1,
        "remaining_threat": 0,
        "simulated_alive_players": 38
      }
    ]
  },
  {
    "roundstart_players": 50,
    "threat_level": 45.9,
    "snapshot": {
      "antag_percent": 0.08,
      "remaining_threat": 28.9,
      "rulesets": [
        "Traitors"
      ]
    },
    "midround_rules": [
      {
        "ruleset": "Syndicate Sleeper Agent",
        "weight": 20,
        "cost": 8,
        "execution_time": 14571.4,
        "remaining_threat": 20.9,
        "simulated_alive_players": 46
      },
      {
        "ruleset": "Morph",
        "weight": 3,
        "cost": 8,
        "execution_time": 29142.9,
        "remaining_threat": 12.9,
        "simulated_alive_players": 42
      },
      {
        "ruleset": "Space Dragon",
        "weight": 4,
        "cost": 11,
        "execution_time": 43714.3,
        "remaining_threat": 1.9,
        "simulated_alive_players": 39
      },
      {
        "ruleset": "Space Ninja",
        "weight": 3,
        "cost": 9,
        "execution_time": 72857.1,
        "remaining_threat": 0,
        "simulated_alive_players": 34
      }
    ]
  },
  {
    "roundstart_players": 50,
    "threat_level": 56.7,
    "snapshot": {
      "antag_percent": 0.08,
      "remaining_threat": 36.7,
      "rulesets": [
        "Nuclear Emergency"
      ]
    },
    "midround_rules": [
      {
        "ruleset": "Obsessed",
        "weight": 3,
        "cost": 5,
        "execution_time": 12666.7,
        "remaining_threat": 31.7,
        "simulated_alive_players": 47
      },
      {
        "ruleset": "Morph",
        "weight": 3,
        "cost": 8,
        "execution_time": 25333.3,
        "remaining_threat": 23.7,
        "simulated_alive_players": 42
      },
      {
        "ruleset": "Space Dragon",
        "weight": 4,
        "cost": 11,
        "execution_time": 38000,
        "remaining_threat": 12.7,
        "simulated_alive_players": 39
      },
      {
        "ruleset": "Space Pirates",
        "weight": 4,
        "cost": 8,
        "execution_time": 50666.7,
        "remaining_threat": 4.7,
        "simulated_alive_players": 36
      },
      {
        "ruleset": "Space Dragon",
        "weight": 1,
        "cost": 11,
        "execution_time": 63333.3,
        "remaining_threat": 0,
        "simulated_alive_players": 34
      }
    ]
  },
  {
    "roundstart_players": 50,
    "threat_level": 33.2,
    "snapshot": {
      "antag_percent": 0.06,
      "remaining_threat": 18.2,
      "rulesets": [
        "Heretics"
      ]
    },
    "midround_rules": [
      {
        "ruleset": "Abductors",
        "weight": 4,
        "cost": 7,
        "execution_time": 16000,
        "remaining_threat": 11.2,
        "simulated_alive_players": 46
      },
      {
        "ruleset": "Space Ninja",
        "weight": 3,
        "cost": 9,
        "execution_time": 32000,
        "remaining_threat": 2.2,
        "simulated_alive_players": 42
      },
      {
        "ruleset": "Space Pirates",
        "weight": 4,
        "cost": 8,
        "execution_time": 64000,
        "remaining_threat": 0,
        "simulated_alive_players": 40
      }
    ]
  },
  {
    "roundstart_players": 50,
    "threat_level": 14.2,
    "snapshot": {
      "antag_percent": 0.04,
      "remaining_threat": 6.2,
      "rulesets": [
        "Traitors"
      ]
    },
    "midround_rules": [
      {
        "ruleset": "Obsessed",
        "weight": 3,
        "cost": 5,
        "execution_time": 26000,
        "remaining_threat": 1.2,
        "simulated_alive_players": 50
      },
      {
        "ruleset": "Space Ninja",
        "weight": 3,
        "cost": 9,
        "execution_time": 78000,
        "remaining_threat": 0,
        "simulated_alive_players": 46
      }
    ]
  },
  {
    "roundstart_players": 50,
    "threat_level": 29.6,
    "snapshot": {
      "antag_percent": 0.06,
      "remaining_threat": 14.6,
      "rulesets": [
        "Heretics"
      ]
    },
    "midround_rules": [
      {
        "ruleset": "Syndicate Sleeper Agent",
        "weight": 20,
        "cost": 8,
        "execution_time": 16000,
        "remaining_threat": 6.6,
        "simulated_alive_players": 45
      },
      {
        "ruleset": "Obsessed",
        "weight": 3,
        "cost": 5,
        "execution_time": 32000,
        "remaining_threat": 1.6,
        "simulated_alive_players": 41
      },
      {
        "ruleset": "Blob",
        "weight": 3,
        "cost": 12,
        "execution_time": 64000,
        "remaining_threat": 0,
        "simulated_alive_players": 35
      }
    ]
  },
  {
    "roundstart_players": 50,
    "threat_level": 35.6,
    "snapshot": {
      "antag_percent": 0.04,
      "remaining_threat": 27.6,
      "rulesets": [
        "Traitors"
      ]
    },
    "midround_rules": [
      {
        "ruleset": "Space Dragon",
        "weight": 4,
        "cost": 11,
        "execution_time": 16000,
        "remaining_threat": 16.6,
        "simulated_alive_players": 49
      },
      {
        "ruleset": "Malfunctioning AI",
        "weight": 2,
        "cost": 13,
        "execution_time": 32000,
        "remaining_threat": 3.6,
        "simulated_alive_players": 49
      },
      {
        "ruleset": "Space Pirates",
        "weight": 4,
        "cost": 8,
        "execution_time": 64000,
        "remaining_threat": 0,
        "simulated_alive_players": 47
      }
    ]
  },
  {
    "roundstart_players": 50,
    "threat_level": 36.5,
    "snapshot": {
      "antag_percent": 0.08,
      "remaining_threat": 19.5,
      "rulesets": [
        "Traitors"
      ]
    },
    "midround_rules": [
      {
        "ruleset": "Syndicate Sleeper Agent",
        "weight": 20,
        "cost": 8,
        "execution_time": 14571.4,
        "remaining_threat": 11.5,
        "simulated_alive_players": 48
      },
      {
        "ruleset": "Morph",
        "weight": 3,
        "cost": 8,
        "execution_time": 29142.9,
        "remaining_threat": 3.5,
        "simulated_alive_players": 43
      },
      {
        "ruleset": "Wizard",
        "weight": 1,
        "cost": 15,
        "execution_time": 72857.1,
        "remaining_threat": 0,
        "simulated_alive_players": 39
      }
    ]
  },
  {
    "roundstart_players": 50,
    "threat_level": 32.8,
    "snapshot": {
      "antag_percent": 0.06,
      "remaining_threat": 20.8,
      "rulesets": [
        "Blood Brothers"
      ]
    },
    "midround_rules": [
      {
        "ruleset": "Morph",
        "weight": 3,
        "cost": 8,
        "execution_time": 16000,
        "remaining_threat": 12.8,
        "simulated_alive_players": 47
      },
      {
        "ruleset": "Blob",
        "weight": 3,
        "cost": 12,
        "execution_time": 32000,
        "remaining_threat": 0.799999,
        "simulated_alive_players": 43
      },
      {
        "ruleset": "Space Dragon",
        "weight": 4,
        "cost": 11,
        "execution_time": 64000,
        "remaining_threat": 0,
        "simulated_alive_players": 41
      }
    ]
  },
  {
    "roundstart_players": 50,
    "threat_level": 19.2,
    "snapshot": {
      "antag_percent": 0.04,
      "remaining_threat": 11.2,
      "rulesets": [
        "Traitors"
      ]
    },
    "midround_rules": [
      {
        "ruleset": "Syndicate Sleeper Agent",
        "weight": 20,
        "cost": 8,
        "execution_time": 21000,
        "remaining_threat": 3.2,
        "simulated_alive_players": 50
      },
      {
        "ruleset": "Space Ninja",
        "weight": 3,
        "cost": 9,
        "execution_time": 63000,
        "remaining_threat": 0,
        "simulated_alive_players": 42
      }
    ]
  },
  {
    "roundstart_players": 50,
    "threat_level": 42.2,
    "snapshot": {
      "antag_percent": 0.08,
      "remaining_threat": 25.2,
      "rulesets": [
        "Traitors"
      ]
    },
    "midround_rules": [
      {
        "ruleset": "Syndicate Sleeper Agent",
        "weight": 20,
        "cost": 8,
        "execution_time": 14571.4,
        "remaining_threat": 17.2,
        "simulated_alive_players": 48
      },
      {
        "ruleset": "Malfunctioning AI",
        "weight": 2,
        "cost": 13,
        "execution_time": 29142.9,
        "remaining_threat": 4.2,
        "simulated_alive_players": 45
      },
      {
        "ruleset": "Space Ninja",
        "weight": 3,
        "cost": 9,
        "execution_time": 72857.1,
        "remaining_threat": 0,
        "simulated_alive_players": 42
      }
    ]
  },
  {
    "roundstart_players": 50,
    "threat_level": 49.1,
    "snapshot": {
      "antag_percent": 0.04,
      "remaining_threat": 33.1,
      "rulesets": [
        "Changelings"
      ]
    },
    "midround_rules": [
      {
        "ruleset": "Syndicate Sleeper Agent",
        "weight": 20,
        "cost": 8,
        "execution_time": 13500,
        "remaining_threat": 25.1,
        "simulated_alive_players": 47
      },
      {
        "ruleset": "Blob",
        "weight": 3,
        "cost": 12,
        "execution_time": 27000,
        "remaining_threat": 13.1,
        "simulated_alive_players": 42
      },
      {
        "ruleset": "Space Dragon",
        "weight": 4,
        "cost": 11,
        "execution_time": 40500,
        "remaining_threat": 2.1,
        "simulated_alive_players": 40
      },
      {
        "ruleset": "Space Pirates",
        "weight": 4,
        "cost": 8,
        "execution_time": 67500,
        "remaining_threat": 0,
        "simulated_alive_players": 35
      }
    ]
  },
  {
    "roundstart_players": 50,
    "threat_level": 44.3,
    "snapshot": {
      "antag_percent": 0.02,
      "remaining_threat": 24.3,
      "rulesets": [
        "Wizard"
      ]
    },
    "midround_rules": [
      {
        "ruleset": "Obsessed",
        "weight": 3,
        "cost": 5,
        "execution_time": 14571.4,
        "remaining_threat": 19.3,
        "simulated_alive_players": 48
      },
      {
        "ruleset": "Space Ninja",
        "weight": 3,
        "cost": 9,
        "execution_time": 29142.9,
        "remaining_threat": 10.3,
        "simulated_alive_players": 47
      },
      {
        "ruleset": "Space Ninja",
        "weight": 1,
        "cost": 9,
        "execution_time": 43714.3,
        "remaining_threat": 1.3,
        "simulated_alive_players": 47
      },
      {
        "ruleset": "Space Pirates",
        "weight": 4,
        "cost": 8,
        "execution_time": 72857.1,
        "remaining_threat": 0,
        "simulated_alive_players": 43
      }
    ]
  },
  {
    "roundstart_players": 50,
    "threat_level": 38.2,
    "snapshot": {
      "antag_percent": 0.04,
      "remaining_threat": 30.2,
      "rulesets": [
        "Traitors"
      ]
    },
    "midround_rules": [
      {
        "ruleset": "Space Pirates",
        "weight": 4,
        "cost": 8,
        "execution_time": 16000,
        "remaining_threat": 22.2,
        "simulated_alive_players": 45
      },
      {
        "ruleset": "Blob",
        "weight": 3,
        "cost": 12,
        "execution_time": 32000,
        "remaining_threat": 10.2,
        "simulated_alive_players": 40
      },
      {
        "ruleset": "Morph",
        "weight": 3,
        "cost": 8,
        "execution_time": 48000,
        "remaining_threat": 2.2,
        "simulated_alive_players": 36
      },
      {
        "ruleset": "Space Dragon",
        "weight": 4,
        "cost": 11,
        "execution_time": 64000,
        "remaining_threat": 0,
        "simulated_alive_players": 33
      }
    ]
  },
  {
    "roundstart_players": 50,
    "threat_level": 3,
    "snapshot": {
      "antag_percent": 0,
      "remaining_threat": 3,
      "rulesets": [
        
      ]
    },
    "midround_rules": [
      {
        "ruleset": "Space Dragon",
        "weight": 4,
        "cost": 11,
        "execution_time": 72000,
        "remaining_threat": 0,
        "simulated_alive_players": 50
      }
    ]
  },
  {
    "roundstart_players": 50,
    "threat_level": 32,
    "snapshot": {
      "antag_percent": 0,
      "remaining_threat": 32,
      "rulesets": [
        
      ]
    },
    "midround_rules": [
      {
        "ruleset": "Abductors",
        "weight": 4,
        "cost": 7,
        "execution_time": 18000,
        "remaining_threat": 25,
        "simulated_alive_players": 46
      },
      {
        "ruleset": "Space Pirates",
        "weight": 4,
        "cost": 8,
        "execution_time": 36000,
        "remaining_threat": 17,
        "simulated_alive_players": 43
      },
      {
        "ruleset": "Space Ninja",
        "weight": 3,
        "cost": 9,
        "execution_time": 54000,
        "remaining_threat": 8,
        "simulated_alive_players": 42
      },
      {
        "ruleset": "Space Dragon",
        "weight": 4,
        "cost": 11,
        "execution_time": 72000,
        "remaining_threat": 0,
        "simulated_alive_players": 38
      }
    ]
  },
  {
    "roundstart_players": 50,
    "threat_level": 26.7,
    "snapshot": {
      "antag_percent": 0.04,
      "remaining_threat": 18.7,
      "rulesets": [
        "Traitors"
      ]
    },
    "midround_rules": [
      {
        "ruleset": "Morph",
        "weight": 3,
        "cost": 8,
        "execution_time": 18000,
        "remaining_threat": 10.7,
        "simulated_alive_players": 48
      },
      {
        "ruleset": "Space Pirates",
        "weight": 4,
        "cost": 8,
        "execution_time": 36000,
        "remaining_threat": 2.7,
        "simulated_alive_players": 45
      },
      {
        "ruleset": "Blob",
        "weight": 3,
        "cost": 12,
        "execution_time": 72000,
        "remaining_threat": 0,
        "simulated_alive_players": 39
      }
    ]
  }
]

Changelog

🆑
tweak: Tweaks dynamic's endgame, making only specific threats capable of spawning after the midround spawn time limit has passed (100 minute mark) and making dynamic ignore the cost of threats after that point has passed.
/:cl:

@PowerfulBacon PowerfulBacon marked this pull request as ready for review September 19, 2023 17:51
@PowerfulBacon
Copy link
Member Author

Looking more at the json data, it might honestly be best to lower the endgame time point a little bit, since at 75 minute it will disable long running antags from spawning just before the shuttle arrives and it often takes a long amount of time to actually activate its rulesets after that point passes.

@PowerfulBacon
Copy link
Member Author

PowerfulBacon commented Sep 19, 2023

I could also make the high impact ruleset flag get disabled in the lategame, since if you survive 1 high impact ruleset than another one can probably be reasonably fired but I'll only trial without that for now.

Copy link
Member

@itsmeow itsmeow left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Lategame executions should have special displays on the roundend report showing that they ignore threat and were executed past the lategame time.

code/game/gamemodes/dynamic/dynamic.dm Outdated Show resolved Hide resolved
code/game/gamemodes/dynamic/dynamic.dm Show resolved Hide resolved
code/game/gamemodes/dynamic/dynamic_midround_rolling.dm Outdated Show resolved Hide resolved
@@ -40,20 +40,55 @@
initialize_gamemode(config.forced_threat_level, config.roundstart_players)
create_candidates(config.roundstart_players)
gamemode.pre_setup()
gamemode.simulated = TRUE
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

rather than doing this just make it a constructor argument to the gamemode

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Gamemodes are instantiated elsewhere so I don't want to do that since otherwise it would only make sense to add the argument to all gamemodes. Technically it would work because this is DM and DM doesn't care about typing things correctly but it would get a bit ugly

only_ruleset_executed = TRUE
executed_rules += rule
if (rule.persistent)
current_rules += rule
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

what is this all about?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If we are simulating the gamemode, then we want to set everything associated to spawning a gamemode without actually executing it. This will make the rule as being executed and do everything that normal spawning does but won't trigger pre execute or eecute

@itsmeow
Copy link
Member

itsmeow commented Sep 19, 2023

This seems kind of horrible for lowpop since it will just spawn threats that no one has the security to deal with? Does this ignore sec requirements? Even then we lowered them a lot with the expectation that the threat curve will reduce lowpop spam and avoid high impact stuff from happening - the threat requirement of rules at lowpop are a LOT higher than at medium-high pop, so disabling threat requirements means they can just spawn regardless.

@PowerfulBacon
Copy link
Member Author

PowerfulBacon commented Sep 20, 2023

It only ignores threat requirements and the antags selected should still be fine at lowpop as this is after 100 mins and intends to promote a shuttle call. On low-pops it will pick some of the less impactful events due to pop requirements, but it should still cause things to start happening to promote shuttle calls. I did run a 30 pop simulation and the things that were spawned seemed to be okay.
Our biggest problem with low-pop right now is that in the majority of rounds nothing is happening, however I also see complaints about lots of antags so maybe the what dynamic needs is a tighter threat curve at lower populations so that its more consistent with what it ends up creating and has a higher focus on midround threats compared to the roundstart ones like tots and lings (it can end up making a lot of antags through latejoins).

@PowerfulBacon
Copy link
Member Author

As an alternative to pumping out antags at the rate of the (threat level / 7) / 100, I could also make it instantly spawn an end-game threat on the mark and then continue to spawn end-game threats when the last one dies, so you won't get loads at once but if the station handles them then the next will come which kind of forces the station to eventually reach a state of shuttle call. Low pop rounds will probably always end up calling after the first threat.

@itsmeow
Copy link
Member

itsmeow commented Sep 20, 2023

Lowpop should not use this system at all as pop requirements are not flat but based on threat. At 0-24pop most high impact antags do not trigger only due to threat requirements being high, as threat requirement scales with pop.

Lowpop also just doesn't flow the same. It isn't supposed to force end at the 1hr mark. People use the shuttle vote, which is quite effective at gathering sentiment of if the round is too long.

There is much to be said about improving lowpop antag variety but this isn't supposed to do that.

I'm also not a huge fan of this concept overall but I'd like to see it tested for medium to high pop

@llol111
Copy link
Contributor

llol111 commented Sep 20, 2023

As much as i'd personaly prefer if round go on 2 hours ish or even a bit longer, its true that thats not realy feasible with things are.
Tweaking dynameme to push things to a close past 100mins is proably a decent idea with the state of things being as they are.

My only concern would be if its set to only run these "late game" midrounds, it might get a bit repetitive/predictable.
Also, do the ones marked "late game" still have a chance to run pre-100 minutes? They should imo, but its unclear to me from pr desc.

also, this is masively out of scope, but it'd be realy cool if dynameme and random events were the same system or atleast interlinked or something (if they arent already, but i assume they're not). Rounds can be affected by non-antag random events just as well as antags, and the station doesnt need a blob to spawn when theres already meteors on the way, and the other way around. (Atleast most of the time, its always neat to have a smal but nonzero chanche)

@PowerfulBacon
Copy link
Member Author

Also, do the ones marked "late game" still have a chance to run pre-100 minutes? They should imo, but its unclear to me from pr desc.

Yea, the flag is only for the point after dynamic runs out of threat for midround. These are specifically for threats which do not need preperation and are generally chaotic enough to at least push a shuttle call to happen.

Lowpop should not use this system at all as pop requirements are not flat but based on threat. At 0-24pop most high impact antags do not trigger only due to threat requirements being high, as threat requirement scales with pop.

The pop requirements are based on threat but are still respected. The threat will remain 30 or whatever once we hit the end-game and it will still respect the pop requirements that are setup with 30 threat. The only checks it skips is the check to see if the threat remaining is less than the cost. In addition to this, all of these rulesets work at lowpop except for blob and xenomorph infestation which do use non-dynamic minimum_player limits.
Space dragon, Blob and Xenos will not trigger under 25 players regardless of end-game state.
Space pirates and spiders will not trigger under 27 players regardless of end-game state.
Ninja will not trigger under 20 players regardless of end-game state.

This does actually raise an issue that it will spawn a wizard every single time and can't spawn anything else. I'll probably have to add an additional variable that gives a minimum pop to late game spawns so that we can have the other ones spawn on low-pop too since they are capable of working at lowpop and we still want to drive longer rounds to a close. The lowpop closure end will be at 1 hour and 40 minutes which is acceptable, as even at low-pops we don't really want to extend past 2 hour rounds since they are just exhausting and end up draining pop even further.

Another problem this could raise in low-pops is that these won't be able to run anyway due to the requiring enemy crewmembers however if there is no sec I think its fair to not run them. I'll have to think about this and look at some data to see what's the best thing to do about lowpop. Dynamic in general doesn't allow a lot to happen at lower pops looking at it now and almost everything has a pretty high minimum pop presumably since we don't want these happening early in the round. Perhaps rather than a population limit per threat, it would be better to have a minimum time of occuring depending on pop so that bigger threats that can still work at lower pops will be able to occur, just at a later time.

@Rukofamicom Rukofamicom dismissed itsmeow’s stale review November 7, 2023 01:34

Has not been followed up on in over a month

Copy link
Contributor

@Rukofamicom Rukofamicom left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Requested changes have been fulfilled except for those with no follow up. I'm not letting a stale review hold this in place.

Seems like a good PR to prevent rounds from grinding to a complete halt, and ensures quiet rounds still end at a reasonable time.

@Rukofamicom Rukofamicom added this pull request to the merge queue Nov 7, 2023
Merged via the queue into BeeStation:master with commit 0fb8618 Nov 7, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants